using System.Collections.Generic;
using UnityEngine;
using Utils;

namespace Modules.Animation
{
    [RequireComponent(typeof(Animator))]
    public class AnimatorProxy : MonoBehaviour
    {
        protected Animator Anim { private set; get; }

        // 存储动画剪辑名称及其长度的字典
        private Dictionary<string, float> _clipLengths;

        private void Awake()
        {
            // 获取Animator组件
            Anim = GetComponent<Animator>();
        }

        private void Start()
        {
            InitDic();
            InitSkinnedMesh();
        }

        // 初始化字典
        private void InitDic()
        {
            _clipLengths = new Dictionary<string, float>();
            // 遍历所有动画剪辑并将名称和长度存入字典
            foreach (var clip in Anim.runtimeAnimatorController.animationClips)
            {
                _clipLengths.Add(clip.name, clip.length);
            }
        }

        // 初始化蒙皮网格
        private void InitSkinnedMesh()
        {
            foreach (SkinnedMeshRenderer skinnedMeshRenderer in GetComponentsInChildren<SkinnedMeshRenderer>())
            {
                skinnedMeshRenderer.localBounds = skinnedMeshRenderer.sharedMesh.bounds;
                skinnedMeshRenderer.updateWhenOffscreen = true;
            }
        }

        // 播放指定名称的动画状态，并返回该动画的长度
        public float Play(string stateName, float speed = 1)
        {
            if (Anim.HasState(0, Animator.StringToHash(stateName)))
            {
                Anim.speed = speed;
                Anim.Play(stateName, 0, 0);
                return _clipLengths[stateName] / speed;
            }

            LogHelper.Trace($"'{name}'Animator状态 '{stateName}' 未找到。");
            return 0;
        }

        // 设置指定动画状态的播放位置（归一化时间）
        public void SetPos(string stateName, float position)
        {
            if (Anim.HasState(0, Animator.StringToHash(stateName)))
            {
                Anim.speed = 0;
                Anim.Play(stateName, 0, position);
            }
            else
            {
                LogHelper.Trace($"'{name}'Animator状态 '{stateName}' 未找到。");
            }
        }

        // 将指定动画状态的播放位置设置到开始
        public void SetPosToStart(string stateName)
        {
            SetPos(stateName, 0);
        }

        // 将指定动画状态的播放位置设置到结束
        public void SetPosToEnd(string stateName)
        {
            SetPos(stateName, 1);
        }
    }
}